package modelo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.LinkedList;

import modelo.auto.Caja;
import modelo.auto.Combustible;
import modelo.auto.ElementoTaller;
import modelo.auto.KitNeumatico;
import modelo.auto.Motor;
import modelo.escenario.Pista;
import modelo.escenario.Superficie;
import modelo.excepciones.InvalidMaxMarchaCajaException;
import modelo.juego.Usuario;

public class Data implements Serializable{
	/*ATRIBUTOS*/
	private static final long serialVersionUID = 1L;
	
	private LinkedList<Pista> pistas;
	
	private LinkedList<Usuario> usuarios;
	
	private LinkedList<ElementoTaller> elementos_taller;
	
	
	/*GETTERS*/
	public LinkedList<Pista> getPistas() {
		return pistas;
	}
	
	public LinkedList<Usuario> getUsuarios() {
		return usuarios;
	}
	
	public LinkedList<ElementoTaller> getElementosTaller() {
		return elementos_taller;
	}
	
	/*METODOS PUBLICOS*/
	
	/**
	 * Constructor
	 */
	public Data(LinkedList<Pista> pistas, LinkedList<Usuario> usuarios, LinkedList<ElementoTaller> elementos_taller) {
		this.elementos_taller = elementos_taller;
		this.pistas = pistas;
		this.usuarios = usuarios;
	}
	

	/**
	 * Persiste los datos del juego
	 * @param archivo path del archivo a guardar
	 * @throws IOException
	 */
	public void guardar(String archivo)throws IOException{
		ObjectOutputStream salida = new ObjectOutputStream(
				new FileOutputStream(archivo));
		salida.writeObject(this);
	}
	
	/*METODOS ESTATICOS*/
	
	/**
	 * 
	 * @param archivo
	 * @return 
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static Data abrir(String archivo) throws IOException, ClassNotFoundException{
		ObjectInputStream entrada = new ObjectInputStream(
				new FileInputStream(archivo));
		return (Data)entrada.readObject();
	}
	
	public static Data crearNueva() {
		
		
		// Creo las pistas
		LinkedList<Pista> pistas = new LinkedList<Pista>();
		Superficie sup1 = new Superficie();
		Superficie sup2 = new Superficie();
		Superficie sup3 = new Superficie();
		
		sup1.setTipo(1);
		Pista pista1 = new Pista(300000, sup1);
		pistas.add(pista1);
				
		sup2.setTipo(2);
		Pista pista2 = new Pista(400000, sup2);
		pistas.add(pista2);
				
		sup3.setTipo(0);
		Pista pista3 = new Pista(500000, sup3);
		pistas.add(pista3);	
		
		// Creo los elementos del taller
		LinkedList<ElementoTaller> elementos = new LinkedList<ElementoTaller>();
		
		Combustible combustible = new Combustible();
		Combustible combustible2 = new Combustible("Combustible super","combustible",200,10.5,1,1, 100, 100);
		
		KitNeumatico neumaticos= new KitNeumatico("Neumaticos Superiores","Neumaticos",100,120,1,1,120,10);
		Caja caja= new Caja();
		Motor motor= new Motor("Motor de F1","Motor",1000,300,1,1,100,70000,300);
		try {motor.setCaja(caja);} 
		catch (InvalidMaxMarchaCajaException e) {} /*Es imposible que lance una exepcion en este caso por eso no hago nada*/
		
		
		elementos.add(combustible);
		elementos.add(neumaticos);
		elementos.add(caja);
		elementos.add(motor);
		elementos.add(combustible2);
		// Creo la lista de usuarios
		LinkedList<Usuario> usuarios = new LinkedList<Usuario>();
		
		return new Data(pistas,usuarios, elementos);
	}
}
